package com.ruoyi.util.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author syc
 * @Date Created in 10:32 2022/8/9
 * @Description 通过反射实例化对象
 */
public class CreateDx {
    /**
     * @Author syc
     * @Date Created in 2022-08-09 10:36:22
     * @Description 这里只是为了演示, 需要通用方法自己封装下
     */
    public static void NewInstance() {
        // 下面这段代码是以反射机制的方式创建对象。

        // 通过反射机制，获取Class，通过Class来实例化对象
        Class<?> c = null;
        try {
            c = Class.forName("com.ruoyi.util.reflect.User");
            // newInstance() 这个方法会调用User这个类的无参数构造方法，完成对象的创建。
            // 重点是：newInstance()调用的是无参构造，必须保证无参构造是存在的！
            Object obj = c.newInstance();
            System.out.println(obj);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Author syc
     * @Date Created in 2022-08-09 14:30:55
     * @Description 通过反射机制,实现有无参有参构造方法,创建对象
     *  如果需要调用无参构造方法. getDeclaredConstructor()方法星兴参为空即可(和Class类的newInstance()方法一样的效果)
     */
    public static void createDx() {
        //使用反射机制创建对象（以前）
        Class<?> userClass = null;
        try {
            userClass = Class.forName("com.ruoyi.util.reflect.User");
            // 调用无参数构造方法
            Object obj1 = userClass.newInstance();//Class类的newInstance方法
            System.out.println(obj1);

            //使用反射机制创建对象（现在）
            // 调用有参数的构造方法怎么办？
            // 第一步：先获取到这个有参数的构造方法
            Constructor<?> c1 = userClass.getDeclaredConstructor(String.class, Integer.class);
            // 第二步：调用构造方法new对象
            Object obj2 = c1.newInstance("刘三河", 46);//Constructor类的newInstance方法
            System.out.println(obj2);

            // 获取无参数构造方法
            Constructor<?> c2 = userClass.getDeclaredConstructor();
            Object obj3 = c2.newInstance();
            System.out.println(obj3);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
     
      // 过反射机制,实现有无参有参构造方法,创建对象
//    public static void main(String[] args) {
//        CreateDx.createDx();
//    }
}